<?php
/**
 *
 * Author: Lyu
 * Date: 2023/7/22
 * Time: 14:42
 */

namespace App\Model\Core\Admin;

use App\Model\CoreModel;

class AdminUserModel extends CoreModel
{

    protected string $table = 'admin_user';

    /**
     * 获取单条用户信息
     * @param int $user_id
     * @param bool $is_cache
     * @return array
     */
    public function getOne(int $user_id, bool $is_cache = true): array
    {
        if ($user_id <= 0) {
            return [];
        }
        return $this->cache($user_id, function () use ($user_id) {
            return obj_to_array($this->getConnectionTable()->where('user_id', $user_id)->first());
        }, $is_cache);
    }

    /**
     * 根据用户名/手机号获取用户信息
     * @param string $key 用户名/手机号/邮箱值
     * @param string $value 用户名/手机号/邮箱值
     * @param bool $is_cache
     * @return array
     */
    private function geUserByKey(string $key, string $value, bool $is_cache = true): array
    {
        if (empty($value) || empty($key) || !in_array($key, ['username', 'mobile', 'other_open_id'])) {
            return [];
        }
        $cache_k = $key . ':' . $value;
        return $this->cache($cache_k, function () use ($key, $value) {
            return obj_to_array($this->getConnectionTable()->where($key, $value)->first());
        }, $is_cache);
    }

    /**
     * 根据用户名获取用户数据
     * @param string $username
     * @param bool $is_cache
     * @return array
     */
    public function getUserByUsername(string $username, bool $is_cache = true): array
    {
        return $this->geUserByKey('username', $username, $is_cache);
    }

    /**
     * 根据手机号获取用户数据
     * @param string $mobile
     * @param bool $is_cache
     * @return array
     */
    public function getUserByMobile(string $mobile, bool $is_cache = true): array
    {
        return $this->geUserByKey('mobile', $mobile, $is_cache);
    }

    /**
     * 添加用户信息
     * @param array $user_data
     * @return bool|int
     */
    public function addOne(array $user_data): bool|int
    {
        if (empty($user_data)) {
            return false;
        }
        return $this->getConnectionTable()->insertGetId($user_data);
    }

    /**
     * 更新用户信息
     * @param int $user_id
     * @param array $user_data
     * @return bool
     */
    public function updateOne(int $user_id, array $user_data): bool
    {
        if ($user_id <= 0 || empty($user_data)) {
            return false;
        }
        $old_user_info = self::getOne($user_id);
        $res = $this->getConnectionTable()->where('user_id', $user_id)->update($user_data);
        if ($res) {
            self::clearCache($old_user_info);
        }
        return $res;
    }

    /**
     * 删除用户信息
     * @param int $user_id
     * @return bool
     */
    public function deleteOne(int $user_id): bool
    {
        if ($user_id <= 0) {
            return false;
        }
        $old_user_info = self::getOne($user_id);
        if (empty($old_user_info)) {
            return false;
        }
        $res = $this->getConnectionTable()->where('user_id', $user_id)->delete();
        if ($res) {
            self::clearCache($old_user_info);
        }
        return $res;
    }

    /**
     * 清空缓存
     * @param array $old_user_info
     * @return $this
     */
    public function clearCache(array $old_user_info): static
    {
        $cache_k = $old_user_info['user_id'];
        $this->cleanCache($cache_k);
        $cache_k = 'username:' . $old_user_info['username'];
        $this->cleanCache($cache_k);
        $cache_k = 'mobile:' . $old_user_info['mobile'];
        $this->cleanCache($cache_k);
        return $this;
    }
}
